<?php

namespace App\Models\Common;

use App\Http\Controllers\Laifei\Work\LaifeiWorkSettlementController;
use App\Models\ProxyMember;
use App\Models\Tools\Data;
use EasyWeChat\Kernel\Messages\Media;
use EasyWeChat\Kernel\Messages\News;
use EasyWeChat\Kernel\Messages\NewsItem;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Symfony\Component\Cache\Adapter\RedisAdapter;

class Wechat extends Model
{
    /**
     * official_account
     * @return mixed
     */
    public static function officialAccount()
    {
        return self::appRedis(app('wechat.official_account'));
    }

    /**
     * payment
     * @return mixed
     */
    public static function payment()
    {
        return self::appRedis(app('wechat.payment'));
    }

    /**
     * 使用redis缓存
     * @param $app
     * @return mixed
     */
    public static function appRedis($app)
    {
        $predis = app('redis')->connection()->client();
        $cache = new RedisAdapter($predis);
        $app->rebind('cache', $cache);
        return $app;
    }


    /**
     * 事件消息处理
     * @param $message
     * @return bool|string
     */
    public static function responseEvent($message)
    {
        // 关注事件
        if ($message['Event'] === 'subscribe') {
            Log::debug('用户关注', $message);
            $app = self::officialAccount();

            // 查询系统中是否存在这个用户，如果没有，先增加一条用户信息(仅有openid)
            // 检查这个用户是否存在于系统内
            $we_id = DB::table('lottery_users')->where('openid', '=', $message['FromUserName'])->value('we_id');
            if (is_null($we_id)) {
                DB::table('lottery_users')->insert(['openid' => $message['FromUserName']]);
            }

            // 如果是扫描推广码进来的，关联这个用户
            if (!is_null($message['EventKey']) && strpos($message['EventKey'], 'qrscene_proxy_') !== false) {
                // 如果已经是老用户，那么推广无效
                if (is_null($we_id)) {
                    $proxy_we_id = substr($message['EventKey'], 14);
                    // 新建这个用户信息,并绑定这个代理
                    DB::table('lottery_users')->where('openid', '=', $message['FromUserName'])->update([
                        'proxy' => $proxy_we_id,
                        'proxy_at' => date('Y-m-d H:i:s'),
                    ]);
                    $proxy_openid = DB::table('lottery_users')->where('we_id', '=', $proxy_we_id)->value('openid');
                    // 通知给代理
                    $app->customer_service
                        ->message('您已成功邀请新用户关注来飞网,请引导其打开公众号进行后续认证操作，用户消费后您将获得返利分成。')
                        ->to($proxy_openid)->send();
                }
            }

            if (is_null($message['EventKey']) || strpos($message['EventKey'], 'qrscene_proxy_') !== false) {
                return '来啦？就知道你有眼光！😘

来飞网是一个内容交易平台。实体店主在平台发布探店任务，达人在平台接单并发布探店笔记，通过精彩的点评内容帮助店主做营销。平台每期还会组织霸王餐活动，邀约达人到店免费体验，体验后发布到店探店笔记，快速提升店铺的星级和人气

  👉<a href="weixin://bizmsgmenu?msgmenucontent=我是店主&msgmenuid=-1">店主端功能介绍</a>

  👉<a href="weixin://bizmsgmenu?msgmenucontent=我是用户&msgmenuid=-1">达人端功能介绍</a>

⭕ 如有其他疑问，请点击公众号底部菜单“个人中心”，咨询在线客服
--------------
💡 欢迎加入来飞网代理人计划，首年享10%推广佣金，不设上限
👉发送“推广码”3个字，即可成为我们的代理人噢';
            } else if (strpos($message['EventKey'], 'qrscene_proxy_') === false) {
                // 如果是从分享页来的，直接返回这个链接
                $url = $message['EventKey'];
                $url = substr($url, 8);
                $url = '<a href="' . $url . '">点击👉参与霸王餐活动</a>';
                return $url;
            }
            return false;

        }

        // 点击事件
        if ($message['Event'] === 'CLICK') {
            return '⭕点击👉 <a href="weixin://bizmsgmenu?msgmenucontent=rg&msgmenuid=-1">人工客服</a> 帮您解答

-------- 温馨提示 --------

⭕ 产品功能介绍

    👉<a href="weixin://bizmsgmenu?msgmenucontent=我是店主&msgmenuid=-1">店主端功能介绍</a>

    👉<a href="weixin://bizmsgmenu?msgmenucontent=我是用户&msgmenuid=-1">达人端功能介绍</a>

⭕来飞网，让你的店铺飞起来！';
        }


        // 其他事件
        return false;
    }


    public static function responseText($message)
    {
        if ($message['Content'] === '@openid') {
            return $message['FromUserName'];
        }
        if ($message['Content'] === '我是店主') {
            $env = env('APP_ENV') === 'production' ? 'production' : 'testing';
            $media_id = Data::$media_id[$env]['shop'];
            self::sendServiceMessage($media_id, $message['FromUserName']);
            return true;
        }
        if ($message['Content'] === '我是用户') {
            $env = env('APP_ENV') === 'production' ? 'production' : 'testing';
            $media_id = Data::$media_id[$env]['talent'];
            self::sendServiceMessage($media_id, $message['FromUserName']);
            return true;
        }
        if ($message['Content'] === '主菜单') {
            return '⭕ 产品功能介绍

    👉<a href="weixin://bizmsgmenu?msgmenucontent=我是店主&msgmenuid=-1">店主端功能介绍</a>

    👉<a href="weixin://bizmsgmenu?msgmenucontent=我是用户&msgmenuid=-1">达人端功能介绍</a>

⭕来飞网，让你的店铺飞起来！';
        }
        if ($message['Content'] === '推广码') {
            $openid = $message['FromUserName'];
            $user = DB::table('lottery_users')->where('openid', '=', $openid)->first();
            $user = json_decode(json_encode($user), true);
            if (is_null($user['nickname'])) {
                return '申请认证成为代理前请先打开来飞网菜单栏内的任意页面完成用户身份授权';
            }
            $qrCode = ProxyMember::qrCode($user['we_id']);
//            $app = Wechat::officialAccount();
//            $app->customer_service->message('<a href="'.$qrCode.'">我的推广码</a>')->to($openid)->send();
            return '💡 欢迎加入来飞网代理人计划
🉐 代理人分享专属推广码，店主通过代理人的推广码关注公众号并下单，平台首年向代理人按每笔订单金额的10%支付推广费，可实时提现！
👉点击下方“我的推广码”获取专属推广码
👉<a href="'.$qrCode.'">我的推广码</a>
-------------------
【操作指令】
💡发送“推广码”--生成代理人专属二维码
💡发送“查询余额”--查询当前推广账户余额
💡发送“提现”--提取账户余额中的现金';
        }
        if ($message['Content'] === '查询余额') {
            $openid = $message['FromUserName'];
            $user = DB::table('lottery_users')->where('openid', '=', $openid)->first();
            $user = json_decode(json_encode($user), true);
            if (is_null($user['nickname'])) {
                return '您尚未认证用户信息，请先打开任意网页页面并授权采集您的信息';
            }
            $proxy = DB::table('proxy_users')->where('we_id','=',$user['we_id'])->first();
            if (is_null($proxy)){
                return '您尚未申请代理，点击获取您的专属<a href="weixin://bizmsgmenu?msgmenucontent=推广码&msgmenuid=-1">推广码</a>';
            }
            $proxy = json_decode(json_encode($proxy), true);
            $wallet = $proxy['wallet'];
            $result = '您当前的余额为'.($wallet/100.00).'元,';
            if($wallet > 100){
                $result .= '点击<a href="weixin://bizmsgmenu?msgmenucontent=提现&msgmenuid=-1">提现</a>';
            } else {
                $result .= '余额1元可提现';
            }
            $result .= '
-------------------
【操作指令】
💡发送“推广码”--生成代理人专属二维码
💡发送“查询余额”--查询当前推广账户余额
💡发送“提现”--提取账户余额中的现金';
            return $result;
        }
        if ($message['Content'] === '提现') {
            // 查询用户信息
            $openid = $message['FromUserName'];
            $user = DB::table('lottery_users')->where('openid', '=', $openid)->first();
            $user = json_decode(json_encode($user), true);
            if (is_null($user['nickname'])) {
                return '请先打开来飞网菜单栏内的任意页面完成用户身份授权';
            }
            // 查询代理信息
            $proxy = DB::table('proxy_users')->where('we_id', '=', $user['we_id'])->first();
            $proxy = json_decode(json_encode($proxy), true);
            if (is_null($proxy)) {
                return '您尚未成为<a href="weixin://bizmsgmenu?msgmenucontent=推广码&msgmenuid=-1">认证代理</a>';
            }
            // 余额
            if ($proxy['wallet'] < 100) {
                return '您目前余额为' . ($proxy['wallet'] / 100.00) . '元，最低提现金额为1元
-------------------
【操作指令】
💡发送“推广码”--生成代理人专属二维码
💡发送“查询余额”--查询当前推广账户余额
💡发送“提现”--提取账户余额中的现金';
            }

            // 发送红包

            $wallet = $proxy['wallet'];
            while ($wallet > 100) {
                try {
                    DB::beginTransaction();
                    $price = $wallet >= 20000 ? 20000 : $wallet;
                    $wallet = $wallet - $price;
                    DB::table('proxy_users')->where('we_id', '=', $user['we_id'])->decrement('wallet', $price);

                    // 新增这条提现记录
                    $log_id = DB::table('proxy_log')->insertGetId([
                        'type' => 0,
                        'proxy_we_id' => $user['we_id'],
                        'proxy_price' => $price,
                    ]);

                    // 红包单号:prefix+2与探店红包区分
                    $mchBillNo = self::billNo($log_id);
                    $redpackData = [
                        'mch_billno' => $mchBillNo,
                        'send_name' => '来飞网',
                        're_openid' => $openid,
                        'total_amount' => $price, // 单位为分，不小于100
                        'wishing' => '您在来飞网的提现已发送，请查收~',
                        'act_name' => '代理返现',
                        'remark' => '感谢您使用来飞网',
                    ];
                    $payment = Wechat::payment();
                    $redpack = $payment->redpack;
                    $result = $redpack->sendNormal($redpackData);

                    if ($result['result_code'] === 'SUCCESS') { // 支付成功记录表格完成
                        Log::notice('红包发送记录', ['result' => $result]);
                    } else { // 当状态为FAIL时，存在业务结果未明确的情况。所以如果状态是FAIL，请务必再请求一次查询接口[请务必关注错误代码（err_code字段），通过查询得到的红包状态确认此次发放的结果。]，以确认此次发放的结果。
                        //记录FAIL
                        Log::debug('红包支付状态FAIL,$mchBillNo为' . $mchBillNo . ',即将重试');
                        $result = $redpack->info($mchBillNo); // 再请求一次查询接口以确认此次发放的结果;
                        if ($result['result_code'] === 'SUCCESS') { // 如果查询已经发放成功，继续后续流程
                            Log::notice('红包发送记录', ['result' => $result]);
                        } else { // 确认发放失败
                            Log::error('红包发送失败', $result);
                            throw new \Exception($result['return_msg']);
                        }
                    }
                    DB::table('proxy_log')->where('log_id','=',$log_id)->update([
                        'mch_billno'=>$mchBillNo,
                    ]);
                } catch (\Exception $e) {
                    DB::rollBack();
                    Log::error(Wechat::class, ['msg' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()]);
                    // 查询余额
                    $wallet = DB::table('proxy_users')->where('we_id','=',$user['we_id'])->value('wallet');
                    return '提现结束，您的当前的余额为'.($wallet/100.00).'元';
                    break;
                }
                DB::commit();
            }
            $wallet = DB::table('proxy_users')->where('we_id','=',$user['we_id'])->value('wallet');
            return '提现结束，您的当前的余额为'.($wallet/100.00).'元';
        }
        return false;
    }

    public static function responseImage($message)
    {
        return 'event';
    }


    public static function responseVoice($message)
    {
        return 'voice';
    }

    public static function responseVideo($message)
    {
        return 'video';
    }


    public static function responseLocation($message)
    {
        return 'location';
    }


    public static function responseLink($message)
    {
        return 'event';
    }


    public static function responseFile($message)
    {
        return 'file';
    }

    /**
     * 发送微信客服消息
     * @param int $media_id
     * @param int $openid
     */
    public static function sendServiceMessage($media_id, $openid)
    {
        $app = self::officialAccount();
        $media = new Media($media_id, 'mpnews');
        $app->customer_service->message($media)->to($openid)->send();
    }

    /**
     * 获取工单的商户订单号
     * @param $log_id
     * @return bool|mixed|string
     */
    public static function billNo($log_id)
    {
        try{
            DB::beginTransaction();

            $mch_id = env('WECHAT_PAYMENT_MCH_ID');
            $date = date('Ymd');

            // 查询今日最大单号的mch_billNo
            $max_log = DB::table('proxy_log')
                ->where('mch_billno','like',$mch_id.$date.'%')
                ->whereNotNull('mch_billno')
                ->orderByDesc('mch_billno')
                ->first();
            $max_log = json_decode(json_encode($max_log), true);
            if(is_null($max_log)){ // 如果没有，新建一个
                $mch_billno = $mch_id.$date.(env('WECHAT_PAYMENT_PREFIX')+2).'000000001'; // mch_billno默认：($mch_id+$date+$prefix+000000001)
                DB::table('proxy_log')->where('log_id','=',$log_id)->update(['mch_billno'=>$mch_billno]);
                DB::commit();
                return $mch_billno; // mch_billno默认：($mch_id+$date+$prefix+000000001)
            }
            // 今天最大的billno
            $mch_billno = $max_log['mch_billno'];
            if($max_log['log_id'] === $log_id) { // 当前工单就是最高的mch_id
                DB::commit();
                return $mch_billno;
            } else { // mch_id+1
                $prefix = substr($mch_billno,0,19);
                $no = substr($mch_billno,19); // 编号
                $no = str_pad($no + 1,9,'0',STR_PAD_LEFT);// 新单号+1
                $mch_billno = $prefix . $no;
                DB::table('proxy_log')->where('log_id','=',$log_id)->update(['mch_billno'=>$mch_billno]);
                DB::commit();
                return $mch_billno;
            }
        }catch (\Exception $e){
            Log::error(LaifeiWorkSettlementController::class, ['msg' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine()]);
            DB::rollBack();
            return false;
        }
    }

}
